import {type P } from './02'
/* let a:any = 10
a = '你好ts' */


/* // 定义数组 
// 使用 类型定义
const arr: number[] = [1,2,3,4];
// 使用泛型
const arr2: Array<string> = ['a', 'b', 'c'];
// 元祖 可以理解为特性类型数组 每个值 类型可以不一样
const tuple: [string, number, boolean] = ['你好', 10, true] */

// 函数
// function fn (a:number, b:number): number {
//   return a+b
// }
// fn(10, 20)

/* // void 函数没有返回值
const fn = (a:number, b: number):void => {
  return a+b
}
fn(10, 20) */
// 可选参数 可传可不传 定义为 最后一个为可选参数
/* function fn (a:number, b:string, c?:number) {
  console.log(a+b+c);
  
}
fn(10, '333') */

// 参数的默认值 ts参数默认值可以不是最后一个
/* function fn(a:number, b:number=30, c:string='这是默认值'){
  console.log(a);
  console.log(b);
  console.log(c);
}
fn(10, undefined, '这是我传的值') */



// 对象的类型
// object类型 只能校验 该变量是对象 对象的结构 （属性和属性的类型）是无法校验
/* const obj:object = {
  a: 10,
  b: 20
}
 */
// interface 接口 自定义类型 描述 对象结构 也可以定义函数的结构

// 描述 对象
/* interface PersonType {
  name: string,
  age: number,
  gender: string
}
const p1:PersonType  = {
  name: '小红',
  age: 18,
  gender: '女'
} */
// 可选属性
/* interface PersonType {
  name: string,
  age: number,
  gender?: string
}
const p1:PersonType  = {
  name: '小红',
  age: 18
} */
// 只读属性  属性值不能修改的
/* interface PersonType {
  readonly id: number,
  name: string,
  age: number,
  gender?: string
}
const p1:PersonType  = {
  id: 10,
  name: '小红',
  age: 18
}
p1.age = 20
p1.id = 3999 */

// 接口描述函数类型
/* interface FnType {
  (a:number, b:string): number
}
const fn: FnType = (a: number, b: string): number => {
  return 10
} */

/* 
  ts类型推论：
    定义变量时，可以不指定类型， ts自动推论该变量的类型
    
*/
// 1 定义变量赋初始值  根据初始值的类型 进行 变量类型推论
/* let a = 10;
a = '单位的无多'; */
// 2 定义变量 不赋值  自动推论成 any类型
/* let a;
a = 10;
a = '你哈' */

// 3 函数参数 会根据默认值 推论 形参的类型
/* function fn(a = 10) {
  console.log(a);
  
}
fn('你好世界') */

// 联合类型
/* let a: number|string = 10;
a = '男男女女';
a  = 2000;
console.log(a.substring(0,2)) */


/* 
  函数形参的类型保护
  当型参 类型是联合类型 ，自动启动 类型保护，在函数内部 不管调用 哪个类型api都会报错
  原因：
    函数定义时 无法判断 用户到底 传什么类型值 （ 报错 作为警告）

    类型断言：
      联合类型 类型保护时，使用某个类型的 api 需要告诉ts 我现在 指定他就是xxx类型 然后再使用对应api

*/
/* function fn (a: string|number) {
  const b = a as string;
  if (b.length) {
    console.log(b.length);
  }
  
  const c = a as number;
  if (c.toFixed) {
    console.log(c.toFixed(2));
      
  }
} */

// 类型别名
/* type Name = string;
let a:Name = '你好';
a = 1000 */
/* type Person = {
  name: string,
  age: number,
  gender: string
}
const p1: Person = {
  name: '小明',
  age: 18,
  gender: '男'
}

function fn(obj: {name: string,age: number,gender: string}) {
  console.log(obj.name);
  
}

fn({
  name: 'dwefrgth',
  age: 19,
  gender: '男'
}) */
export {}